package sxt.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class DBUtil {
    /*SqlSession工厂,用于创建SqlSession对象*/
    private static SqlSessionFactory factory;

    /*本地线程池,用于存放SqlSession对象.

    tips:如果不这样做,用户的每一次请求,每一次增删改查操作,
    都会创建一个SqlSession对象.这样会影响服务器的速度.
    而使用SqlSession本地线程池,就可以保证在有SqlSession对象的时候,
    可以直接从线程池中获取.减少了服务器创建SqlSession对象的时间,提高了响应效率*/
    private static ThreadLocal<SqlSession> tl=new ThreadLocal<>();

    static {
        InputStream inputStream=null;
        try {
            //1.解析xml文件
            inputStream= Resources.getResourceAsStream("mybatis.xml");
            factory = new SqlSessionFactoryBuilder().build(inputStream);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    //获得sqlsession对象
    public static SqlSession getSqlSession(){
        //获得ThreadLocal中的sqlsession对象
        SqlSession sqlSession=tl.get();

        if (sqlSession==null){

             sqlSession=factory.openSession(true);

            //把创建好的对象放到ThreadLocal
            tl.set(sqlSession);
        }
        return tl.get();
    }

    //关闭sqlsession
    public static void closeAll(){
        SqlSession sqlSession=tl.get();

        if (sqlSession!=null){
            sqlSession.close();
        }
        tl.set(null);
    }
}
